今天就來介紹SQL
,預計SQL
介紹一篇,NoSQL
介紹一篇,今天的話就以大家比較常聽見的MySQL
當例子。
一款關聯式資料庫管理系統(RDBMS)
,多應用在中小型的網站中,配合如PHP
、ASP
或ASP.NET
等後端程式語言,儲存數據,若網站擁有後端管理程式系統(網站後台),多須配合資料庫功能。
RDBMS (Relational Database Menagement System)
關聯式資料庫管理系統
- 由各種資料表
(Table)
組成- 資料各自存在資料表中,再由特定欄位將多資料表串起來
- 透過
SQL
語言管理資料庫,用來新增、查詢、更新和刪除資料。
Go有提供SQL
的抽象介面database/sql,而網路上也有前輩提供了go-sql-driver/mysql套件,提供了SQL
的抽象介面來去實作。
$ go get -u github.com/go-sql-driver/mysql
import(
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
在測試時有發生以下問題,查一下後發現是因為MySQL
建立時沒設root
密碼導致,使用指令把密碼設定好就好。2022/10/05 19:01:57 Error 1045: Access denied for user 'root'@'localhost' (using password: NO)
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
const (
UserName string = "test_root"
Password string = "password"
Addr string = "127.0.0.1"
Port int = 3306
Database string = "test"
MaxLifetime int = 10
MaxOpenConns int = 10
MaxIdleConns int = 10
)
func main() {
conn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", UserName, Password, Addr, Port, Database)
db, err := sql.Open("mysql", conn)
if err != nil {
fmt.Println("connection to mysql failed:", err)
return
}
}
由於完整的連線格式如下,因此用常數都先設好再Sprintf
成字串會比較方便。[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
SetConnMaxLifetime
:設置了連接可重用的最大時間SetMaxOpenConns
:設定最大連線數SetMaxIdleConns
:設定閒置連線量進入CRUD前先看一下SQL
中的之前建立的一張表,pokemon
。
查詢以外,都是將SQL
語法寫好並使用db.Exec()
執行,有參數要填入的地方使用?
取代,並補在後面。
接著上面的繼續寫
result, err := db.Exec(
"INSERT INTO pokemon (pokemonID, pokemonName, description) VALUES (?, ?, ?)",
19,
"烏龜獸",
"每天去吃吃到飽,是一隻九十公斤的胖子",
)
烏龜獸成功被建立了。
result, err := db.Exec(
"UPDATE pokemon SET pokemonID = ? WHERE pokemonName = ?",
18,
"烏龜獸",
)
烏龜獸19
修正成18
result, err := db.Exec(
"DELETE from pokemon WHERE pokemonID = ?",
18,
)
刪除就看不到了,沒截圖ˊˇˋ
db.QueryRow
: 查詢單筆資料db.Query
: 查詢多筆資料查詢得到row
之後要用變數存放查詢到的值,下例是建立id
、name
、description
存放並直接print
出來。
row, err := db.Query("SELECT * FROM pokemon")
defer row.Close() // 最後釋放資源
if err != nil {
log.Fatal(err)
return
}
for row.Next() {
var id string
var name string
var description string
if err := row.Scan(&id, &name, &description); err != nil {
log.Fatal(err)
}
fmt.Printf("id:%s name:%s description:%s\n", id, name, description)
}
output:
id:1 name:皮卡丘 description:棲息在森林中的寶可夢。由於它臉頰上的袋子中儲存了電能,觸摸了之後會覺得麻麻的。
id:2 name:正電拍拍 description:會製造火花拉拉球來給夥伴加油。能從電線桿上吸取電力。
.
.
.
Go使用MySQL
的差不多就介紹到這,其他不屬於Go的部分,屬於SQL
那邊的就不多講了,今天就介紹到這吧,明天再來看看Go操作NoSQL
的方法。
Golang 如何使用 mysql
https://ithelp.ithome.com.tw/articles/10207409
[DAY22]Golang玩MySQL
https://ithelp.ithome.com.tw/articles/10243865
使用 MySQL 資料庫
https://willh.gitbook.io/build-web-application-with-golang-zhtw/05.0/05.2